package hight;

public class AqsTest {

    /**
     * 1.抽象队列同步器简称AQS ，它同步器的基础组件，JUC中锁的底层实现均依赖与AQS，开发不需要使用
     * 2.采用FIFO的双向队列实现，队列元素为Node(静态内部类)，Node内的thread变量用于存储进入队列的线程
     * 3.Node节点内部的SHARED用来标记该线程时获取共享资源时被阻塞挂起后放入AQS队列的
     * EXCLUSIVE用来标记线程时获取独占资源时被挂起后放入AQS队列的，WaitStatus记录当前线程等待状态
     * ，可以为CANCELLED(线程被取消了)、signal(线程需要被唤醒)、CONDITION(线程在条件队列里面等)
     * 、PROPAGATE(释放共享资源时需要通知其他节点)；prev记录当前节点的前驱节点，next记录当前节点的后继节点
     * 4.在AQS中维持了一个单一的状态信息state,可以通过getState,setState,compareAndSetState函数修改其值。对于ReentrantLock
     * 的实现来说state可以用来表示当前线程获取锁的可重入次数，低16位表示获取到写锁
     * 的线程的可重入次数，对于semaphore来说，state用来表示当前可用信号的个数，对于countDownlatch来说
     * ，state用来表示计数器当前的值
     */
    /**
     * 
     * 五种锁
     * 1.乐观锁，悲观锁：是否在修改之啊钱给记录增加排他锁
     * 2.公平锁/非公平锁：请求锁的时间顺序是否与获得锁的时间顺序一致，一致为公平锁，不一致为非公平锁
     * 3.独占锁/共享锁：是否可以被多个线程共同持有，可以则为共享锁，不可以则为独占锁
     * 4.可重入锁：一个线程再次获取它自己已经获取的锁时，是否被阻塞
     * 5.自旋锁：无法获取锁时是否立刻被阻塞，还是继续尝试获取指定次数
     */
    /**
     * 只有被单个线程所持有的锁时独占锁，可以被多个线程持有的锁是共享锁
     * 2.ReentrantLock 就是以独占锁的方式实现的，属于悲观锁
     * ReadWriteLock读写锁是以共享锁方式实现的，属于乐观锁
     * StampedLock的写锁，属于悲观锁
     * StampedLock的乐观读锁，乐观读锁，属于乐观锁
     */
    /**
     * 当一个线程想要获取本心阿成已经持有的锁是，不会被阻塞，而是能够再次获得这个锁，这就是重入锁
     * 2.Synchornized是一种可重入锁，内部维护一个吸纳陈标志，以及一个计数器
     * 3.ReentrantLock也是一种可重入锁
     * 4.ReadWriteLock,StampedLock的读锁也是可重入锁
     */
    public static void main(String[] args) {

    }
}
